#include "stm32f10x.h"
#include "./flash.h"
/**
 @brief 内部Flash写入
 @param address -[in] 写入的地址
 @param pData -[in&out] 指向需要操作的数据
 @param dataLen -[in] 数据长度
 @return true - 成功；false - 失败
*/
bool WriteFlash(uint32_t addrStart, uint32_t *pData, uint32_t dataLen)
{   
    uint32_t i = 0;
    uint32_t eraseCounter = 0x00;                                                               // 记录要擦除多少页
    uint32_t address = 0x00;                                                                    // 记录写入的地址
    uint32_t numberOfPage = 0x00;                                                               // 记录写入多少页
    FLASH_Status flashStatus = FLASH_COMPLETE;                                                  // 记录每次擦除的结果
    
    address = addrStart;
    
    FLASH_Unlock();                                                                             // 解锁
    numberOfPage = (WRITE_END_ADDR - address) / FLASH_PAGE_SIZE;                                // 计算要擦除多少页
    FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);  // 清除所有标志
    
    // 按页擦除
    for(eraseCounter = 0; (eraseCounter < numberOfPage) && (flashStatus == FLASH_COMPLETE); eraseCounter++)
    {
        flashStatus = FLASH_ErasePage(address + (FLASH_PAGE_SIZE * eraseCounter));
    }
    
    for(i = 0; (i < dataLen)&&(flashStatus == FLASH_COMPLETE); i++)
    {
        flashStatus = FLASH_ProgramWord(address, pData[i]);                                     // 写入一个字（32位）的数据入指定地址
        address = address + 4;                                                                  // 地址偏移4个字节 
    }
    
    FLASH_Lock();                                                                               // 重新上锁
    
    if(flashStatus == FLASH_COMPLETE)
    {
        return true;
    }
    return false;
}

/**
 @brief 内部Flash读取
 @param address -[in] 读取的地址
 @param pData -[in&out] 指向需要操作的数据
 @param dataLen -[in] 数据长度
 @return true - 成功；false - 失败
*/
bool ReadFlash(uint32_t addrStart, uint32_t *pData, uint32_t dataLen)
{
    uint32_t i = 0;
    uint32_t address = 0x00;
    
    address = addrStart;
    
    for(i = 0; i < dataLen; i++)
    {
        pData[i] = (*(__IO uint32_t*) address);                                                 // 读指定地址的一个字的数据
        // WPrint("read flash, address: %x value:%X",address,pData[i]);
        address += 4;                                                                           // 地址偏移4个字节        
    }
    
    return true;
}
